Tool Set
Erased map of tools indexed by name — what the agent loop actually carries. Application code constructs via toolSetOf.
Erasure (using * projections) is required because a single agent holds tools with different TInput/TOutput types. Type recovery happens at the dispatch site via the tool's own serializers.